# 封装购物车记录的合并函数
import pickle
import base64

from django_redis import get_redis_connection


def merge_cookie_cart_to_redis(request, user, response):
    """将cookie中的购物车记录合并到登录用户的redis记录中"""
    # 1.获取cookie中的购物车记录
    cookie_cart = request.COOKIES.get('cart')

    if cookie_cart is None:
        # cookie购物车无数据，不需要合并
        return

        # 解析cookie中的数据
    # {
    #     '<sku_id>': {
    #         'count': '<count>',
    #         'selected': '<selected>'
    #     }
    # }

    cart_dict = pickle.loads(base64.b64decode(cookie_cart.encode()))  # 也可能 {}
    if not cart_dict:
        # 字典为空，cookie购物车无数据，不需要合并
        return

        # 组织数据
    # 在cart字典中保存cookie购物车添加的所有商品的id和对应数量count，此字典的数据在进行购物车合并的时候设置到redis
    # {
    #     '<sku_id>':'<count>',
    #     ......
    # }
    cart = {}

    # 在cart_selected_add 列表中保存cookie中被勾选的商品id，此列表中的商品id在进行购物车合并的时候需要进行覆盖
    cart_selected_add = []
    # 在cart_selected_remove 列表中保存cookie中未被勾选的商品id，此列表中的商品id在进行购物车合并的时候需要进行剔除
    cart_selected_remove = []

    for sku_id, count_selected in cart_dict.items():
        cart[sku_id] = count_selected['count']

        if count_selected['selected']:
            # 勾选
            cart_selected_add.append(sku_id)
        else:
            # 未勾选
            cart_selected_remove.append(sku_id)

    # 2、进行合并
    # 获取redis连接
    redis_conn = get_redis_connection('cart')

    # cart字典中的键值作为属性和值设置到redis的hash 中
    cart_key = 'cart_%s' % user.id
    redis_conn.hmset(cart_key, cart)

    # cart_selected_add 列表中的商品id都添加到redis set元素中
    cart_selected_key = 'cart_selected_%s' % user.id

    if cart_selected_add:
        redis_conn.sadd(cart_selected_key, *cart_selected_add)

    # cart_selected_remove 列表中的商品id都从redis set元素中移除
    if cart_selected_remove:
        redis_conn.srem(cart_selected_key, *cart_selected_remove)

    # 3、清除cookie中的购物车记录
    response.delete_cookie('cart')
